static ce_route* currentRoute = NULL; // Current route being processed
static queue ce_mark_head; // List of stand-alone marks currently found
static ce_mark* currentMark = NULL; // Current mark being processed
-static char* time_buffer = NULL; // Time buffer for processing times
static char* uuid_buffer = NULL; // UUID buffer for processing uuid's
static char* xml_buffer = NULL; // XML buffer for processing XML strings
static int inRoute = 0; // Are we processing a route?
QUEUE_INIT(&ce_mark_head);
// Alloocate all buffers used for writing
- time_buffer = (char*) xcalloc(MY_TBUF,1);
uuid_buffer = (char*) xcalloc(MY_UBUF,1);
xml_buffer = (char*) xcalloc(MY_XBUF, 1);
gbfclose(ofd);
// Free the buffers used for writing
- xfree(time_buffer);
xfree(uuid_buffer);
xfree(xml_buffer);
}
/* Generate a CE-style creation time based on supplied time */
-static char*
+static QString
ce_gen_creation_time(time_t tm)
{
QDateTime qtm;
qtm = QDateTime::fromTime_t(tm);
- xml_fill_in_time(time_buffer, qtm, XML_SHORT_TIME);
- return time_buffer;
+ return qtm.toUTC().toString("yyyyMMddTHHmmssZ");
}
/* Generate a CE-style creation time based on current time */
-static char*
+static QString
ce_gen_current_time(void)
{
return ce_gen_creation_time(current_time());
#include "grtcirc.h"
#include "strptime.h"
#include "jeeps/gpsmath.h"
-#include "xmlgeneric.h" // for xml_fill_in_time.
#include "garmin_fs.h"
#define MYNAME "CSV_UTIL"
static
int
-writetime(char* buff, size_t bufsize, const char* format, time_t t, int gmt)
+writetime(char* buff, size_t bufsize, const char* format, time_t t, bool gmt)
{
static struct tm* stmp;
} else {
stmp = localtime(&t);
}
-
return strftime(buff, bufsize, format, stmp);
}
case XT_TIMET_TIME_MS: {
/* time as a time_t variable in milliseconds */
char tbuf[24];
- writetime(tbuf, sizeof(tbuf), "%s", wpt->GetCreationTime(), 0);
+ writetime(tbuf, sizeof(tbuf), "%s", wpt->GetCreationTime(), false);
char mbuf[32];
snprintf(mbuf, sizeof(mbuf), "%s%03d", tbuf, wpt->microseconds / 1000);
writebuff(buff, "%s", mbuf);
writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->GetCreationTime()));
break;
case XT_GMT_TIME:
- writetime(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 1);
+ writetime(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), true);
break;
case XT_LOCAL_TIME:
- writetime(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 0);
+ writetime(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), false);
break;
case XT_HMSG_TIME:
writehms(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 1);
writehms(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 0);
break;
case XT_ISO_TIME:
- writetime(buff, sizeof buff, "%Y-%m-%dT%H:%M:%SZ", wpt->GetCreationTime(), 1);
+ writetime(buff, sizeof buff, "%Y-%m-%dT%H:%M:%SZ", wpt->GetCreationTime(), true);
break;
case XT_ISO_TIME_MS:
- xml_fill_in_time(buff, wpt->GetCreationTime(), XML_LONG_TIME);
+ strcpy(buff, wpt->GetCreationTime().toPrettyString().toUtf8().data());
break;
case XT_GEOCACHE_LAST_FOUND:
writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->gc_data->last_found));
*/
#include "defs.h"
-#include "xmlgeneric.h"
#include "cet_util.h"
#include "garmin_fs.h"
#if HAVE_LIBEXPAT
}
if (wpt && wpt->gc_data->exported &&
strcmp(tag->tagname, "groundspeak:cache") == 0) {
- char time_string[64];
- xml_fill_in_time(time_string, wpt->gc_data->exported,
- XML_LONG_TIME);
- if (time_string[0]) {
- writer.writeTextElement("time", time_string);
- }
+ writer.writeTextElement("time",
+ wpt->gc_data->exported.toPrettyString());
}
writer.writeEndElement();
}
}
gpsbabel::DateTime now = current_time();
- char time_string[64];
- xml_fill_in_time(time_string, now, XML_LONG_TIME);
- if (time_string[0]) {
- writer.writeTextElement("time", time_string);
- }
+ writer.writeTextElement("time", now.toPrettyString());
+
gpx_write_gdata(&gpx_global->keywords, "keywords");
gpx_write_bounds();
}
if (wpt->creation_time && (gtc_least_time > wpt->GetCreationTime())) {
- gtc_least_time = wpt->GetCreationTime();
+ gtc_least_time = wpt->GetCreationTime();
gtc_start_lat = wpt->latitude;
gtc_start_long = wpt->longitude;
}
gtc_new_study_lap(rte);
route_disp(rte, gtc_study_lap);
if (gtc_least_time) {
- char time_string[100];
- xml_fill_in_time(time_string, gtc_least_time, XML_LONG_TIME);
+ const char* time_string = gtc_least_time.toPrettyString().toUtf8().data();
gtc_write_xml(0, "<Id>%s</Id>\n", time_string);
gtc_write_xml(1, "<Lap StartTime=\"%s\">\n", time_string);
} else {
kml_td(hwriter, "Max Cadence", QString(" %1 rpm ").arg(QString::number(td->max_cad)));
}
if (td->start && td->end) {
- char time_string[64];
- // FIXME (robertl): this straddling of time and string types is killing me
- xml_fill_in_time(time_string, QDateTime::fromTime_t(td->start), XML_LONG_TIME);
- kml_td(hwriter, "Start Time", QString(" %1 ").arg(time_string));
- xml_fill_in_time(time_string, QDateTime::fromTime_t(td->end), XML_LONG_TIME);
- kml_td(hwriter, "End Time", QString(" %1 ").arg(time_string));
+ gpsbabel::DateTime t;
+ t = td->start;
+ if (t.isValid()) {
+ kml_td(hwriter, "Start Time", t.toPrettyString());
+ }
+ t = td->end;
+ if (t.isValid()) {
+ kml_td(hwriter, "End Time", t.toPrettyString());
+ }
}
hwriter.writeCharacters("\n");
/* We won't always have times. Garmin saved tracks, for example... */
if (td->start && td->end) {
- char time_string[64];
writer->writeStartElement("TimeSpan");
- // FIXME (robertl): this straddling of time and string types is gross
- xml_fill_in_time(time_string, QDateTime::fromTime_t(td->start), XML_LONG_TIME);
- writer->writeTextElement("begin", time_string);
- xml_fill_in_time(time_string, QDateTime::fromTime_t(td->end), XML_LONG_TIME);
- writer->writeTextElement("end", time_string);
+
+ gpsbabel::DateTime t;
+ t = td->start;
+ writer->writeTextElement("begin", t.toPrettyString());
+ t = td->end;
+ writer->writeTextElement("end", t.toPrettyString());
+
writer->writeEndElement(); // Close TimeSpan tag
}
}
if (kml_time_min || kml_time_max) {
writer->writeStartElement("gx:TimeSpan");
- if (kml_time_min) {
- char time_string[64];
- xml_fill_in_time(time_string, kml_time_min, XML_LONG_TIME);
- if (time_string[0]) {
- writer->writeTextElement("begin", time_string);
- }
+ if (kml_time_min.isValid()) {
+ writer->writeTextElement("begin", kml_time_min.toPrettyString());
}
if (kml_time_max) {
- char time_string[64];
gpsbabel::DateTime time_max;
// In realtime tracking mode, we fudge the end time by a few minutes
// to ensure that the freshest data (our current location) is contained
// ensure the right edge of that time slider includes us.
//
time_max = realtime_positioning ? kml_time_max + 600 : kml_time_max;
- xml_fill_in_time(time_string, time_max, XML_LONG_TIME);
- if (time_string[0]) {
- writer->writeTextElement("end", time_string);
- }
+ writer->writeTextElement("end", time_max.toPrettyString());
}
writer->writeEndElement(); // Close gx:TimeSpan tag
}
QTime time(this->time());
return time.hour() * 10000 + time.minute() * 100 + time.second();
}
+
+ // Like toString, but with subsecond time that's included only when
+ // the trailing digits aren't .000. Always UTC.
+ QString toPrettyString() const {
+ const char* format;
+ if (this->time().msec()) {
+ format = "yyyy-MM-ddTHH:mm:ss.zzzZ";
+ } else {
+ format = "yyyy-MM-ddTHH:mm:ssZ";
+ }
+ return this->toUTC().toString(format);
+ }
+
private:
time_t t_;
};
gbfprintf(ofd, "%s</%s>\n", indent.toAscii().data(), tag.toAscii().data());
}
-void
-xml_fill_in_time(char *time_string, const gpsbabel::DateTime datetime, int long_or_short)
-{
- QDateTime dt = datetime;
- dt = dt.toUTC();
-
- const char* format;
- if (long_or_short == XML_LONG_TIME) {
- format = "yyyy-MM-ddTHH:mm:ssZ";
- if (dt.time().msec()) {
-fprintf(stderr, "this should not be possible");
-abort();
- format = "yyyy-MM-ddTHH:mm:ss.zzzZ";
- }
- } else {
- format = "yyyyMMddTHHmmssZ";
- }
- strcpy(time_string, qPrintable(dt.toString(format)));
-}
-
void
xml_write_time(gbfile *ofd, gpsbabel::DateTime dt, const char *elname)
{
- char time_string[64];
- xml_fill_in_time(time_string, dt, XML_LONG_TIME);
- if (time_string[0]) {
- gbfprintf(ofd, "<%s>%s</%s>\n",
- elname,
- time_string,
- elname
- );
- }
+ gbfprintf(ofd, "<%s>%s</%s>\n",
+ elname,
+ dt.toPrettyString().toUtf8().data(),
+ elname
+ );
}
/***********************************************************************
void write_optional_xml_entity(gbfile* ofd, const QString& indent,
const QString& tag, const QString& value);
void xml_write_time(gbfile* ofd, gpsbabel::DateTime time, const char* elname);
-void xml_fill_in_time(char* time_string, const gpsbabel::DateTime timep, int long_or_short);
void write_xml_header(gbfile* ofd);
void xml_ignore_tags(const char** taglist);